package sessions;

import entities.Documento;
import entities.Mensaje;
import entities.Usuario;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.Singleton;

@Singleton
public class PersistenciaBean implements PersistenciaBeanRemote, PersistenciaBeanLocal
{
    private Statement orden;
    private String driver = "org.postgresql.Driver";
    String connectString = "jdbc:postgresql://localhost:5432/UPSAM";
    String user = "postgres";
    String password = "postgres";
    static PersistenciaBean instance = null;

    public PersistenciaBean()
    {
        try
        {
            //Conexion a postgresql
             Class.forName(driver);
            Connection con = DriverManager.getConnection(connectString, user, password);

            //conexion a derby
//            Connection con = null;
//
//            InitialContext ic = new InitialContext();
//            System.out.println("Antes de la conexion pool");
//            //DataSource ds = (DataSource) ic.lookup("java:comp/env/jdbc/myDatasourceTrfSgr");
//            DataSource ds = (DataSource) ic.lookup("java:comp/env/jdbc/myDatasourceDatosSeguros");
//            System.out.println("Despues de la conexion pool");
//            con = ds.getConnection();
            //return con;
            //fin conexion derby
            orden = con.createStatement();
        } 
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    public static PersistenciaBean getInstance() throws Exception
    {
        if (instance == null)
        {
            instance = new PersistenciaBean();
        }
        return instance;
    }

    boolean recuperarMensajes(Usuario usuario)
    {
        ConexionBean dBean = new ConexionBean();
        //DatoInfo dato = new DatoInfo();
        Connection con = null;
        ResultSet rs = null;
        PreparedStatement pStatement = null;
        try
        {
            con = dBean.getConnection();
            System.out.println("id usuario --> " + usuario.getId());
            String sql = "SELECT * FROM APP.USUARIOS_MENSAJES WHERE ID_USUARIO = " + usuario.getId();
            pStatement = con.prepareStatement(sql);
            //pStatement.setString(1, usuario.getEmail());
            rs = pStatement.executeQuery();
            System.err.println("Estamos en EJB.verMss");
            //System.err.println(rs.next());
            ArrayList contenedorMensajes;
            contenedorMensajes = new ArrayList();
            boolean vacio = true;
            while (rs.next())
            {
                ResultSet rs2 = null;
                PreparedStatement pStatement2 = null;
                Mensaje mensaje = new Mensaje();
                mensaje.setIdUsuario(usuario.getId());
                mensaje.setIdDestinatario(rs.getInt("ID_MSS"));
                //fichero.setNombre(rs.getString("NOMBRE"));
                //fichero.setFichero("")
                System.out.println("Tiene mensajes --> " + mensaje.toString());

                vacio = false;
                sql = "SELECT * FROM APP.FICHERO WHERE ID = " + mensaje.getId();
                pStatement2 = con.prepareStatement(sql);
                //pStatement.setString(1, usuario.getEmail());
                System.out.println("antes de recoger id de tabla fichero");
                rs2 = pStatement2.executeQuery();
                while (rs2.next()) {
                    //mensaje.setNombre(rs2.getString("NOMBRE"));
                    mensaje.setId(rs2.getInt("ID"));
                    System.out.println("antes de meter en contenedor");
                    contenedorMensajes.add(mensaje);
                    System.out.println("Despues de meter en contenedor");
                }
                rs2.close();
                pStatement2.close();
            }
            usuario.setContenedorMensajes(contenedorMensajes);
            if (vacio)
            {
                System.err.println("No tiene ficheros asociados.");
            }
        } 
        catch (Exception e)
        {
           e.printStackTrace();
        }
        try
        {
            rs.close();
            pStatement.close();
            con.close();
            return true;
        } 
        catch (Exception ex)
        {
            System.out.println("Error en el cierre de la base de datos");
            return false;
        }

        //throw new UnsupportedOperationException("Not yet implemented");
    }


       public Usuario login(Usuario usuario)
       {
        try
        {
            ResultSet res = orden.executeQuery("SELECT * FROM usuario WHERE email='" + usuario.getEmail() + "' AND password='" + usuario.getPassword() + "'");
            System.out.println("PersistenciaBean --> despues de consulta");
            while (res.next())
            {
                usuario.setNombre(res.getString("nombre"));
                usuario.setEmail(res.getString("email"));
                usuario.setApellidos(res.getString("apellidos"));
                usuario.setId(res.getInt("id"));
            }
            return usuario;
        } 
        catch (SQLException ex)
        {
            Logger.getLogger(PersistenciaBean.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }

    public int addUsuario(Usuario usuario)
    {
        
        try
        {
            int res = orden.executeUpdate("INSERT INTO usuario (nombre , apellidos, password, email, activacion, acuerdo) "
                               + "values('" + usuario.getNombre() + "','" + usuario.getApellidos() + "','" + usuario.getPassword() + "','" + usuario.getEmail() + "', true, true)");
            return res;
        } 
        catch (SQLException ex)
        {
            Logger.getLogger(PersistenciaBean.class.getName()).log(Level.SEVERE, null, ex);
            return -1;
        }
    }

    public int addMensaje(Mensaje mensaje)
    {
        try
        {

            int res = orden.executeUpdate("INSERT INTO mensaje (ID_USUARIO, ID_DESTINATARIO, MENSAJE, ASUNTO, FECHAENVIO) "
                    + "VALUES (" + mensaje.getIdUsuario() + "," + mensaje.getIdDestinatario() + " , '" + mensaje.getMensaje() + "','" + mensaje.getAsunto() + "', " + mensaje.getFechaEnvio() + ")");
            return res;
        } 
        catch (SQLException ex)
        {
            Logger.getLogger(PersistenciaBean.class.getName()).log(Level.SEVERE, null, ex);
            return -1;
        }
    }

    public List<Mensaje> buscarMensajeUsuario(Usuario usuario)
    {
        List<Mensaje> list = new ArrayList<Mensaje>();
        return list;
    }

    public Usuario buscarUsuarioPorNombre(String nombre)
    {
        Usuario u = new Usuario();
        return u;
    }

    public Usuario buscarUsuarioPorEmail(String email)
    {
        try
        {
            Usuario usuario = new Usuario();
            ResultSet res = orden.executeQuery("SELECT * FROM usuario WHERE email= '" + email + "'");
            while (res.next())
            {
                usuario.setNombre(res.getString("nombre"));
                usuario.setEmail(res.getString("email"));
                usuario.setApellidos(res.getString("apellidos"));
                usuario.setId(res.getInt("ID"));
            }
            return usuario;
        }
        catch (SQLException ex)
        {
            ex.printStackTrace();
            return null;
        }
    }

    boolean recuperarFicheros(Usuario usuario)
    {
        ConexionBean dBean = new ConexionBean();
        //DatoInfo dato = new DatoInfo();
        Connection con = null;
        ResultSet rs = null;
        PreparedStatement pStatement = null;
        try {

            con = dBean.getConnection();
            System.out.println("id usuario --> " + usuario.getId());
            String sql = "SELECT * FROM APP.USUARIOS_FICHEROS WHERE ID_USUARIO = " + usuario.getId();
            pStatement = con.prepareStatement(sql);
            //pStatement.setString(1, usuario.getEmail());
            rs = pStatement.executeQuery();
            System.err.println("Estamos en EJB.verFicheros");
            //System.err.println(rs.next());
            ArrayList contenedorFicheros;
            contenedorFicheros = new ArrayList();
            boolean vacio = true;
            while (rs.next()) {
                ResultSet rs2 = null;
                PreparedStatement pStatement2 = null;
                Documento fichero = new Documento();
                fichero.setIdUsuario(usuario.getId());
                fichero.setIdDocumento(rs.getInt("ID_FICHERO"));
                //fichero.setNombre(rs.getString("NOMBRE"));
                //fichero.setFichero("")
                System.out.println("Tiene ficheros --> " + fichero.toString());

                vacio = false;
                sql = "SELECT * FROM APP.FICHERO WHERE ID = " + fichero.getId();
                pStatement2 = con.prepareStatement(sql);
                //pStatement.setString(1, usuario.getEmail());
                System.out.println("antes de recoger id de tabla fichero");
                rs2 = pStatement2.executeQuery();
                while (rs2.next()) {
                    fichero.setNombre(rs2.getString("NOMBRE"));
                    fichero.setIdDocumento(rs2.getInt("ID"));
                    System.out.println("antes de meter en contenedor");
                    contenedorFicheros.add(fichero);
                    System.out.println("Despues de meter en contenedor");
                }
                rs2.close();
                pStatement2.close();
            }
            usuario.setContenedorFicheros(contenedorFicheros);
            if (vacio) {
                System.err.println("No tiene ficheros asociados.");
            }
        } catch (Exception e) {
            System.out.println("Error --> " + e.getLocalizedMessage());

        }
        try
        {
            rs.close();
            pStatement.close();
            con.close();
            return true;
        } 
        catch (Exception ex)
        {
            System.out.println("Error en el cierre de la base de datos");
            return false;
        }

        //throw new UnsupportedOperationException("Not yet implemented");
    }
}
